<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 * Xử lý người dùng
 *
 * @author luubk
 * @since Apr 9, 2012 - 4:18:29 PM
 */
class User extends MY_Controller
{

    function __construct()
    {
        parent::__construct();
        $this->load->model('m_user');
        $this->load->model('m_user_group');
        $this->load->model('m_user_has_group');
    }

    function login()
    {        
//        $type = 'acx';
        if ($this->session->userdata('loggedin'))
            redirect(site_url());        

        $this->load->helper(array('form', 'url'));
        $this->load->library('form_validation');

        $this->set_var('title', 'Đăng nhập hệ thống');

        $this->form_validation->set_rules('u_name', 'Tên đăng nhập', "required|alpha_dash|callback_check_login");
        $this->form_validation->set_rules('u_pass', 'Mật khẩu', 'required');

        $this->form_validation->set_error_delimiters('<h4 class="alert_error">', '</h4>');
        
        
        if ($this->form_validation->run() == TRUE)
        {
            if ($this->input->is_ajax_request())
                echo 'SUCCESS';
            else
                redirect($this->input->server('HTTP_REFERER'));
        }
        else
        {
            if ($this->input->is_ajax_request())
                echo validation_errors();
            else
            {                
                $this->theme = 'login';   
                $this->view('form');
            }
        }
    }

    function check_login($username = '', $password = '')
    {
        if ($username == '')
            $username = $this->input->post('u_name');

        if ($password == '')
            $password = encrypt_pass($this->input->post('u_pass'));       

//        print_r($password); die;
        $this->load->library('form_validation');
        $this->form_validation->set_message('check_login', 'Tên đăng nhập hoặc mật khẩu không đúng!');

        if ($username == '' OR $password == '')
            return FALSE;      

        $user = $this->m_user->select_one(array('u_name' => $username));
        
        if($user['u_status'] != 1)
        {
            $this->form_validation->set_message('check_login', 'Tài khoản của bạn đã bị vô hiệu hóa!');
            return FALSE;
        }

         if (!$user OR $user['u_pass'] != $password)
             return FALSE;

        if ($this->input->post('remember') == 'ON')
        {
            $cookie = array(
                'name' => 'login_name',
                'value' => $username,
                'expire' => 14 * 24 * 3600,
                'path' => '/'
            );
            
            set_cookie($cookie);
            $cookie = array(
                'name' => 'login_pass',
                'value' => md5($password),
                'expire' => 14 * 24 * 3600,
                'path' => '/'
            );
            set_cookie($cookie);
        }

        $sessdata = array(
            'owner_id' => $user['u_id'],
            'u_name' => $username,
            'loggedin' => TRUE
        );
        $this->session->set_userdata($sessdata);
        $this->m_user->update(array('u_id' => $user['u_id']), array('u_last_login' => time()));

        return TRUE;
    }

    function logout()
    {
        if (!$this->session->userdata('loggedin'))
            redirect(site_url());

        $this->session->unset_userdata('owner_id');
        $this->session->unset_userdata('userid');
        $this->session->unset_userdata('username');
        $this->session->unset_userdata('loggedin');
        $this->session->unset_userdata('backendUid');
        $this->session->unset_userdata('backendSessionKey');

        delete_cookie('login_name', '', '/');
        delete_cookie('login_pass', '', '/');

        redirect(site_url());
    }

    function profile()
    {
        $user = $this->m_user->select_one(array('u_id' => $this->owner_id));

        $this->load->helper(array('form', 'url'));
        $this->load->library('form_validation');

        $rule_name = "alpha_dash|trim|min_length[5]|max_length[120]|xss_clean";
        $rule_pass = 'min_length[5]|match[pass_conf]';
        $rule_email = 'valid_email';

        if ($this->input->post('u_email') && $user['u_email'] != $this->input->post('u_email'))
            $rule_email .= '|callback_check_email';

        $this->form_validation->set_rules('u_name', 'Tên đăng nhập', $rule_name);
        $this->form_validation->set_rules('u_pass', 'Mật khẩu', $rule_pass);
        $this->form_validation->set_rules('u_email', 'Email', $rule_email);

        if ($this->input->post())
            if ($this->form_validation->run() == FALSE)
                _jsonout(TRUE, 'custom', validation_errors('<h4 class="alert_error">', '</h4>'));
            else
            {
                if ($this->input->post('old_pass') != '')
                    if (encrypt_pass($this->input->post('old_pass')) != $user['u_pass'])
                        _jsonout(TRUE, 'error', 'Lỗi! Mật khẩu cũ không đúng!');

                $data = array();
                if ($this->input->post('u_pass') != '')
                    $data['u_pass'] = encrypt_pass(trim($this->input->post('u_pass')));
                $data['u_email'] = trim($this->input->post('u_email'));
                $data['u_phone'] = trim($this->input->post('u_phone'));
                $data['u_updated'] = time();

                if ($this->m_user->update(array('u_id' => $this->owner_id), $data))
                    _jsonout(TRUE, 'success', 'Cập nhật tài khoản thành công!');
                else
                    _jsonout(TRUE, 'error', 'Lỗi! Chưa cập nhật được hồ sơ!');
            }

        $this->_plugins[] = "jquery_form";

        $this->set_var('title', 'Tài khoản của tôi');
        $this->set_var('item', $user);
        $this->view('user/profile');
    }

    function index()
    {
        $this->set_var('items', $this->m_user->multi_select());
        $this->set_var('group', $this->m_user_group->multi_select());
        $this->set_var('title', 'Danh sách tài khoản');
        $this->view('user/index');
    }

    function form($id = FALSE)
    {
        $this->set_var('title', 'Tạo tài khoản');
        if ($id)
            $this->set_var('title', 'Sửa tài khoản');

        $items = $this->m_user->multi_select(array('u_id' => $id));
        $item = $items[0];

        $this->load->helper(array('form', 'url'));
        $this->load->library('form_validation');

        $rule_name = "alpha_dash|trim|min_length[5]|max_length[120]|xss_clean";
        $rule_pass = 'min_length[5]';
        $rule_email = 'valid_email';

        if ($id)
        {
            if ($item['u_name'] != $this->input->post('u_name'))
                $rule_name .= '|callback_check_uname';
            if ($item['u_email'] != $this->input->post('u_email'))
                $rule_email .= '|callback_check_email';
        }
        else
        {
            $rule_name .= "|required|callback_check_uname";
            $rule_pass .= '|required';
            $rule_email .= '|callback_check_email';
        }

        $this->form_validation->set_rules('u_name', 'Tên đăng nhập', $rule_name);
        $this->form_validation->set_rules('u_pass', 'Mật khẩu', $rule_pass);
        $this->form_validation->set_rules('u_email', 'Email', $rule_email);

        if ($this->input->post())
            if ($this->form_validation->run() == FALSE){
                _jsonout(TRUE, 'custom', validation_errors('<h4 class="alert_error">', '</h4>'));
       		 }
            else
                $this->_save($id);

        $this->_plugins[] = "jquery_form";
        $item['u_group_ids'] = explode(",", $item['u_group_ids']);

        $this->set_var('item', $item);
        $this->set_var('group', $this->m_user_group->multi_select());
        $this->set_var('id', $id);
        $this->view('user/form');
    }

    function check_uname($str)
    {
        if ($this->m_user->select_one(array('u_name' => $str)) != FALSE)
        {
            $this->form_validation->set_message('check_uname', "%s $str đã được sử dụng");
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

    function check_email($str)
    {
        if ($this->m_user->select_one(array('u_email' => $str)) != FALSE)
        {
            $this->form_validation->set_message('check_email', "%s $str đã được sử dụng");
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

    private function _save($id = FALSE, $u_name = FALSE)
    {
        $data = array();
        $data['u_name'] = trim($this->input->post('u_name'));
        $data['u_pass'] = encrypt_pass(trim($this->input->post('u_pass')));
        $data['u_email'] = trim($this->input->post('u_email'));
        $data['u_phone'] = trim($this->input->post('u_phone'));        
        $data['u_status'] = intval($this->input->post('u_status'));
        $data['u_updated'] = time();

        if ($id || $u_name)
        {
            if (trim($this->input->post('u_pass')) == "")
                unset($data['u_pass']);
            /**
             *  start db transaction
             */
            $this->db->trans_start();
            // update user infor
            $where = array();
            if($id){
            	$where['u_id'] = $id;
            }
            if($u_name){
            	$where['u_name'] = $u_name;
            }
            $this->m_user->update($where, $data, array('u_name' => ''));
            // delete user group
            $this->m_user_has_group->delete(array('user_id' => $id));
            // insert user group
            if($this->input->post("ug_id") != NULL){
	            foreach($this->input->post("ug_id") as $user_group_id ){
	            	$this->m_user_has_group->insert(array('user_id' => intval($id), 'user_group_id' => intval($user_group_id)));
	            }
            }
            $this->db->trans_complete();
            /**
             *  end db transaciton, and check returned status
             */
            if ($this->db->trans_status() !== FALSE){
            	_jsonout(TRUE, 'success', "Cập nhật tài khoản thành công!");
            } else
                _jsonout(TRUE, 'error', "Không cập nhật được tài khoản!");
        }
        /**
         *  start db transaction
         */
        $this->db->trans_start();
        // update user infor
        $where = array();
		// insert user
        $id = $this->m_user->insert($data);
        // insert user group
        if($this->input->post("ug_id") != NULL){
	        foreach($this->input->post("ug_id") as $user_group_id ){
	        	$this->m_user_has_group->insert(array('user_id' => intval($id), 'user_group_id' => intval($user_group_id)));
	        }
        }
        $this->db->trans_complete();
        if ($this->db->trans_status() !== FALSE)
            _jsonout(TRUE, 'success', "Tạo tài khoản thành công!");
        else
            _jsonout(TRUE, 'error', "Không tạo được tài khoản!");
    }

    public function delete($id = FALSE)
    {
        if ($id)
            $this->m_user->delete(array('u_id' => $id));

        redirect('user');
    }

    function group()
    {
        $this->set_var('items', $this->m_user_group->multi_select());
        $this->set_var('title', 'Danh sách nhóm tài khoản');
        $this->view('user/group');
    }

    function group_form($id = FALSE)
    {
        $this->set_var('title', 'Thêm nhóm tài khoản');
        if ($id)
            $this->set_var('title', 'Sửa nhóm tài khoản');


        $this->load->helper(array('form', 'url'));
        $this->load->library('form_validation');

        $this->form_validation->set_rules('ug_name', 'Tên nhóm', "required|min_length[5]|max_length[120]");
        $this->form_validation->set_rules('ug_role', 'Quyền hạn', 'required');

        if ($this->input->post())
            if ($this->form_validation->run() == FALSE)
                _jsonout(TRUE, 'custom', validation_errors('<h4 class="alert_error">', '</h4>'));
            else
                $this->_group_save($id);

        $this->_plugins[] = "jquery_form";

        $this->set_var('item', $this->m_user_group->select_one(array('ug_id' => $id)));
        $this->load->config('menu');
        $this->set_var('list_permission', $this->config->item('menu'));
        $this->set_var('id', $id);
        $this->view('user/group_form');
    }

    private function _group_save($id = FALSE)
    {
        $data = array();
        $data['ug_name'] = trim($this->input->post('ug_name'));
        $data['ug_desc'] = trim($this->input->post('ug_desc'));
        $data['ug_role'] = serialize($this->input->post('ug_role'));
        $data['ug_status'] = intval($this->input->post('ug_status'));
        $data['ug_updated'] = time();

        if ($id)
            if ($this->m_user_group->update(array('ug_id' => $id), $data))
                _jsonout(TRUE, 'success', "Cập nhật tài khoản thành công!");
            else
                _jsonout(TRUE, 'error', "Không cập nhật được tài khoản!");

        $data['ug_created'] = time();
        if ($this->m_user_group->insert($data))
            _jsonout(TRUE, 'success', "Tạo tài khoản thành công!");
        else
            _jsonout(TRUE, 'error', "Không tạo được tài khoản!");
    }

    public function group_delete($id = FALSE)
    {
        if ($id)
            $this->m_user_group->delete(array('ug_id' => $id));

        redirect('user/group');
    }

}

/**
     * End file user
     */

